#include <iostream>
#include "sqlite3.h"

using namespace std;

#define databaseName "context.db3"

void print_row(int, char**);
int print_result_cb(void*, int, char**, char**);

int main()
{
	sqlite3 *pDB = NULL;
	char * errMsg = NULL;
	char sql[256];

	//打开一个数据库，如果改数据库不存在，则创建一个名字为databaseName的数据库文件
	int rc = sqlite3_open(databaseName, &pDB);
	if (rc)
	{
		cout << " Open the database " << databaseName << " failed" << endl;
		return (-1);
	}

	int nodeId = 122;
	float cpu = 0.2;
	int memory = 512;
	int time = 12346;

	// 创建数据库表所有与ODBC保留关键字冲突的字段名称在前面加上c
	//	rc = sqlite3_exec(
	//					pDB,
	//					"CREATE TABLE resourceInfo(nodeId INTEGER, cpu FLOAT, memory INTEGER, ctime INTEGER)",
	//					0, 0, &errMsg);
	//	if (rc != SQLITE_OK)
	//		cout << errMsg << endl;

	//往表中添加数据

//	for (int i = 0; i < 10; i++)
//	{
//		//定义一条参数SQL命令，其中chn,eng为需要插入的数据
//		sprintf(
//				sql,
//				"INSERT INTO resourceInfo(nodeId, cpu, memory, ctime) VALUES('%d', '%f', '%d', '%d')",
//				++nodeId, cpu++, memory++, time++);
//		rc = sqlite3_exec(pDB, sql, 0, 0, &errMsg);
//		if (rc != SQLITE_OK)
//		{
//			cout << "Error: " << rc << " ..." << errMsg << endl;
//		}
//	}
//
//	return 0;

	nodeId = 122;

	//查询一条记录
	sprintf(sql, "select * from resourceInfo where nodeId = %d "
			"and ctime = (select max(ctime) from resourceInfo where nodeId = %d)",
			nodeId, nodeId);

	cout << "sql: " << sql << endl;
	int nrow = 0, ncolumn = 0;
	char **azResult;
	/*
	 * 查询用sqlite3_get_table，结果通过数组azResult保存，
	 * 内容是先是表格头部名称，接着才是查出来的数据
	 * nrow为查出来的结果数目，为0时表示数据库中不存在符合条件的记录
	 * ncolumn为表格头的域数
	 */

	sqlite3_get_table(pDB, sql, &azResult, &nrow, &ncolumn, &errMsg);

	cout << "row: " << nrow << endl << "column: " << ncolumn << endl;
	for (int i = 0; i < (nrow + 1) * ncolumn; i++)
		cout << i << ": " << azResult[i] << endl;

	sqlite3_free_table(azResult);
	sqlite3_close(pDB);
	return 0;

	//	rc = sqlite3_exec(pDB, sql, print_result_cb, 0, &errMsg);
	//	if (rc != SQLITE_OK)
	//	{
	//		cout << errMsg << endl;
	//		return -1;
	//	}

}

/* data为sqlite3_exec中的第四个参数，
 * n_columns是栏的数目，column_values为查询得到的值得，column_names是栏的名字。
 */
int print_result_cb(void* data, int n_columns, char** column_values,
		char** column_names)
{
	if (data)
		cout << data << endl;
	else
		cout << "None" << endl;
	static int column_names_printed = 0;
	if (!column_names_printed)
	{
		print_row(n_columns, column_names);
		column_names_printed = 1;
	}

	print_row(n_columns, column_values);
	return 0;
}

//对于SQL语句找出来的每一条记录，都会触发一个回调函数的执行过程
void print_row(int n_values, char** values)
{
	cout << "n_values: " << n_values << endl;
	int i;
	for (i = 0; i < n_values; ++i)
	{
		if (i > 0)
			printf("\t");
		printf("%s", values[i]);

	}
	printf("\n");
}

//插入一个表，返回值为SQLITE_OK为成功，否则输出出错信息
//函数参数：第一个为操作数据库的指针，第二句为SQL命令字符串
//第三个参数为callback函数，这里没有用，第四个参数为callback函数
//中的第一个参数，第五个为出错信息

//	for (int i = 0; i < 5000; i++)
//	{
//		rc = sqlite3_exec(pDB,
//				"INSERT INTO ex2(b,c,d,e) VALUES('123','ABC','234','12.0721')",
//				0, 0, &errMsg);
//		if (rc != SQLITE_OK)
//			cout << errMsg << endl;
//	}
//	return 0;

//同上，插入另一个表
